package com.inspinia.upms.rpc.api;

import com.inspinia.base.pagination.Pager;
import com.inspinia.base.service.BaseService;
import com.inspinia.upms.common.model.user.UpmsUser;
import com.inspinia.upms.common.model.user.UpmsUserVo;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;
/**
 * UpmsUserService class
 *
 * @author veblen
 * @date 2018/10/31
 */
public interface UpmsUserService extends BaseService<UpmsUser> {
    /**
     * 检查电话是否重复
     * @param phone
     * @return
     */
    boolean validPhone(String phone);

    /**
     * 检查email是否重复
     * @param email
     * @return
     */
    boolean validEmail(String email);

    /**
     * 获取所有成员信息
     * @return
     */
    List<UpmsUser> getUserList();

    /**
     * 根据userId找到用户拥有的角色id
     *
     * @param userId 用户id
     * @return 用户拥有的角色id
     */
    List<Long> getRoleIds(Long userId);

    /**
     * 向中间表sys_user_role加入数据
     *
     * @param roleIds 角色id
     * @param userId  用户id
     * @return
     */
    int setRole(Long[] roleIds, Long userId);

    /**
     * 根据userId找到用户拥有的角色id
     *
     * @param userId 用户id
     * @return 用户拥有的角色id
     */
    List<Long> findRoleIds(Long userId);
    /**
     * 分页查找
     *
     * @param pageVo
     * @return
     */
    Pager<UpmsUserVo> findPage(UpmsUserVo pageVo);
    /**
     * MD5加密
     *
     * @param sourceStr
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    String md5(String sourceStr);

    /**
     * 获取用户相关信息
     *
     * @param userId 用户id
     * @return
     */
    UpmsUserVo getVo(Long userId);

    /**
     * 对象转vo
     * @param user
     * @return
     */
    UpmsUserVo user2vo(UpmsUser user);

    /**
     * 查找在用户的在线信息
     *
     * @param userIds,可以是string或long
     * @return
     */
    List<UpmsUserVo> findVos(Collection userIds);

    /**
     * 通过用户id集合查找用户
     * @param userIds
     * @return
     */
    List<UpmsUser> findUserByIds(Collection userIds);

    /**
     * 查找用户所在的部门id
     *
     * @param userId 用户id
     * @return 部门id集合
     */
    List<Long> findDeptIds(Long userId);
    /**
     * 查找所有的用户id
     * @return
     */
    List<Long> findAllUserIds();
    /**
     * 根据用户id获取真实姓名
     * @param userId
     * @return
     */
    String getRealNameById(Long userId);

    /**
     * 通过用户id查询所属机构
     * @param userId
     * @return
     */
    List<Long> findOrgIdsByUserId(Long userId);

    /**
     * 查找用户所在的部门的名称
     * @param userId 用户id
     * @return 用户所在部门名称集合
     */
    List<String> findDeptNames(Long userId);

    /**
     * 查找用户所在的机构id
     * @param userId 用户id
     * @return 机构id集合
     */
    List<Long> findOrgIds(Long userId);
    /**
     * 根据角色获取用户
     * @param roleName
     * @param orgId
     * @return
     */
    List<UpmsUser> findUserByRoleNameAndOrgId(Long orgId, String roleName);

    /**
     * 查找部门的所有用户id
     *
     * @param deptIds 部门id
     * @return
     */
    List<Long> findUserIdsByDeptIds(Collection<Long> deptIds);
    /**
     * 查找部门的所有人员id
     *
     * @param deptId
     * @return
     */
    List<Long> findUserIdsByDeptId(Long deptId);

    /**
     * 查找用户的岗位id
     *
     * @param userId 用户id
     * @return
     */
    List<Long> findPostIds(Long userId);

    /**
     * 根据角色id和岗位id查找资源的id集合
     *
     * @param roleIds 角色id集合
     * @param postIds 岗位id集合
     * @return 资源id集合
     */
    List<Long> findResourceIdsByRoleAndPost(List<Long> roleIds, List<Long> postIds);

    /**
     * 添加用户
     * @param user    用户信息
     * @param postIds 岗位id集合
     * @param roleIds 角色id集合
     * @param deptIds 部门id集合
     * @return int
     */
    int insert(UpmsUser user, List<Long> roleIds, List<Long> deptIds, List<Long> postIds);
    /**
     * 验证用户名
     *
     * @param username 用户名
     * @param id       用户id
     * @return true表示验证通过
     */
    boolean validUsername(String username, Long id);

    /**
     * 修改用户
     * @param user    用户信息
     * @param postIds 岗位id集合
     * @param roleIds 角色id集合
     * @param deptIds 部门id集合
     * @return int
     */
    int update(UpmsUser user, List<Long> roleIds, List<Long> deptIds, List<Long> postIds);
    /**
     * 删除用户相关
     * @param userId 用户id
     * @return int
     */
    @Override
    int delete(Long userId);
}
